/**
 * 浅比较工具函数 - 用于性能优化
 * 避免深度比较带来的性能消耗
 */

/**
 * 检查值是否为对象类型
 */
function isObject(value: any): value is object {
  return value !== null && typeof value === 'object';
}

/**
 * 浅比较两个数组
 */
function shallowEqualArray(a: any[], b: any[]): boolean {
  if (a.length !== b.length) return false;

  for (let i = 0; i < a.length; i++) {
    if (a[i] !== b[i]) return false;
  }

  return true;
}

/**
 * 浅比较两个对象
 */
function shallowEqualObject(a: object, b: object): boolean {
  const keysA = Object.keys(a);
  const keysB = Object.keys(b);

  if (keysA.length !== keysB.length) return false;

  for (const key of keysA) {
    if (!(key in b) || (a as any)[key] !== (b as any)[key]) {
      return false;
    }
  }

  return true;
}

/**
 * 浅比较两个值
 * @param a 第一个值
 * @param b 第二个值
 * @returns 是否浅层相等
 */
export function shallowEqual(a: any, b: any): boolean {
  // 引用相等检查
  if (a === b) return true;

  // 类型不同
  if (typeof a !== typeof b) return false;

  // null/undefined 处理
  if (a == null || b == null) return a === b;

  // 数组比较
  if (Array.isArray(a) && Array.isArray(b)) {
    return shallowEqualArray(a, b);
  }

  // 对象比较
  if (isObject(a) && isObject(b)) {
    return shallowEqualObject(a, b);
  }

  // 基本类型已经在引用相等中处理
  return false;
}

/**
 * 为watch函数优化的浅比较封装
 * @param newVal 新值
 * @param oldVal 旧值
 * @returns 是否需要更新
 */
export function shouldUpdate(newVal: any, oldVal: any): boolean {
  return !shallowEqual(newVal, oldVal);
}

/**
 * 数组数据专用浅比较（针对图表数据优化）
 * @param newData 新数据
 * @param oldData 旧数据
 * @returns 是否需要更新
 */
export function shouldUpdateChartData(newData: any[], oldData: any[]): boolean {
  if (!Array.isArray(newData) || !Array.isArray(oldData)) {
    return newData !== oldData;
  }

  return !shallowEqualArray(newData, oldData);
}
